//哲学家进餐问题
//方法一：存在死锁
semaphore chopstick[5] = {1, 1, 1, 1, 1};
Pi(int i) //第i号哲学家进程（i=1,2,3,4,5）;
{
    while (true)
    {
        think;               //思考；
        wait(i);             //拿起左边筷子
        wait((i + 1) % 5);   //拿起右边筷子
        eat;                 //进餐
        signal(i);           //放下左边筷子
        signal((i + 1) % 5); //放下右边筷子
    }
}
//方法二：奇数号哲学家先拿左边筷子，偶数号哲学家先拿右边筷子，无死锁
semaphore chopstick[5] = {1, 1, 1, 1, 1};
Pi(int i) //第i号哲学家进程（i=1,2,3,4,5）;
{
    while (true)
    {
        think;          //思考；
        if (i % 2 == 1) //奇数号哲学家
        {
            wait(i);           //拿起左边筷子
            wait((i + 1) % 5); //拿起右边筷子
        }
        else
        {
            wait((i + 1) % 5); //拿起右边筷子
            wait(i);           //拿起左边筷子
        }
        eat;                 //进餐
        signal(i);           //放下左边筷子
        signal((i + 1) % 5); //放下右边筷子
    }
}
//方法三：只有同时拿起左右两边筷子才能就餐，
semaphore chopstick[5] = {1, 1, 1, 1, 1};
semaphore mutex = 1;
Pi(int i) //第i号哲学家进程（i=1,2,3,4,5）;
{
    while (true)
    {
        think;               //思考；
        wait(mutex);         //独占筷子使用权限
        wait(i);             //拿起左边筷子
        wait((i + 1) % 5);   //拿起右边筷子
        signal(mutex);       //释放筷子使用权限
        eat;                 //进餐
        signal(i);           //放下左边筷子
        signal((i + 1) % 5); //放下右边筷子
    }
}